import java.util.Iterator;
import java.util.List;
import java.util.Random;

public class Mouton extends Animal {
	
	
	
	    private static final int pregnantAge = 6;
	    private static final int ageMax = 50;
      private static final int valeurNourissanteHerbe = 3;//Déinit quand le mouton aura faim
	    // Contrôle de l'âge et de la faim
	    private static final Random rand = Randomizer.getRandom();
	    
	    private int age;
	    private int faim;//niveau de faim
	    private boolean isMale;

	    //on peut creer soit un loup jeune(age zero et pas affaimé), soit avec un age et faim random
      public Mouton(boolean ageRandom, Grille grille, Position position){ 
	        super(grille, position);
	        age = 0;
	        if(ageRandom) {
	            age = rand.nextInt(ageMax);
	        }
	    }
	    public void act(List<Animal> newMoutons){
	        incrementeAge();
	        if(estVivant()) {
	            accoucher(newMoutons);            
	            // Cherche une position libre.
	            Position newPosition = getGrille().positionAdjacDispo(getPosition());
	            if(newPosition != null) {
	                setPosition(newPosition);
	            }
	            else {
	                // Trop d'animaux, il meurt.
	                setMort();
	            }
	        }
	    }
       
       
	    // Incrémente l'age et gère la mort de vieillesse
      // Le mouton devient des sels mineraux s'il meurt
      private void incrementeAge(){
	        age++;
	        if(age > ageMax) {
	            setMort();
	            System.out.println("Le mouton "+getPosition()+" est mort de la viellesse. ");
               //Met des sels minéraux à cette case si possible
                    Grille grille = getGrille();
                    Position p = getPosition();
                    Herbe herbe = grille.getHerbeAt(p);
                    herbe.setSelMineral();

	        }
	    }
       
      // Incrementer le niveau de faim gère la mort de faim
      // Devient des sels minéraux s'il meurt
            private void incrementeFaim(){
                faim++;
                if(faim > 5) {
                    setMort();
                    //Met des sels minéraux à cette case si possible
                    Grille grille = getGrille();
                    Position p = getPosition();
                    Herbe herbe = grille.getHerbeAt(p);
                    herbe.setSelMineral();
                }
                
            }
      
      //Cherche et mange une case d'herbe adjacente
            private Position trouveManger(){
                Grille grille = getGrille();
                List<Position> adjacent = grille.positionsAdjacentes(getPosition());
                Iterator<Position> iter = adjacent.iterator();
                while(iter.hasNext()) {
                    Position pos = iter.next();
                    Herbe herbe = grille.getHerbeAt(pos);
                        if(herbe.estPresente()) { 
                            herbe.setMangee();
                            faim -= valeurNourissanteHerbe;
                            return pos;
                        }
                }
                return null;
            }
            
            
	    //Accouche si c'est une femelle
      private void accoucher(List <Animal> newMoutons){
     	    Grille grille = getGrille();
	        List<Position> adjacents = grille.positionsAdjacentes(getPosition());
	        Iterator<Position> iter = adjacents.iterator();
	        while(iter.hasNext()) {
	            Position pos = iter.next();
	            Object animal = grille.getObjectAt(pos);
	            if(animal instanceof Mouton) {
	                Mouton m = (Mouton) animal;
	                if(m.estVivant()&&this.isMale!=m.isMale()&&m.peutAccoucher()&&peutAccoucher()) {
	                	if (!isMale){
	                		List<Position> dispos = grille.positionsAdjacentesDispos(getPosition());
	                		Position position = dispos.get(0);
	                		Mouton jeune = new Mouton(false, grille, position);
	                		newMoutons.add(jeune);
	                		System.out.println("Le nouveau loup est né à la position"+pos);
	                     }
	                	else m.accoucher(newMoutons);
	                }
	            }
	            
	        }
	    }


	  
	    // Vérifie l'âge pour se reproduire
      private boolean peutAccoucher(){
	        return age >= pregnantAge;
	    }
	    public int getAge(){
	 	   return age;
	    }
	    public boolean isMale(){
	 	   return this.isMale;
	    }
	

}
